"""
 __init__ : required


"""
from typing import Any
from exts import all_logger , UserMongodb

class Field:
    """字段基类，提供基础验证功能"""
    def __init__(self, required=False, default=None ):
        self.required = required
        self.default = default
        all_logger.info(f"调用字段基Field类，提供基础验证功能。required={self.required}")
    def validate(self, value: Any = None ) -> Any:
        """基础验证逻辑"""
        if (value is None) and (self.required is True):
            all_logger.error(f"value字段是必填字段,请添加validate的必选参数")
            raise ValueError(f"value字段是必填字段,请添加validate的必选参数")
        else:
            if value is None:
                all_logger.info(f"value字段是可选字段,已自动使用默认值,Field基类检验通过")
                value = self.default
                return value
            else :
                all_logger.info(f"value字段是可选字段,已使用用户输入值,Field基类检验通过")
            return value
class StringField(Field):
    def __init__(self, min_length=None, max_length=None,required=False , default="error_04435"):
        self.min = min_length
        self.max = max_length
        super().__init__(required=required, default=default)
        all_logger.info(f"调用StringField类，提供字符串长短验证功能。min_length={self.min},max_length={self.max}")
    def validate(self ,value:Any = None):
        """字符串验证逻辑"""
        super().validate(value)
        value = str(value)
        if self.min is not None and len(value) < self.min:
            all_logger.error(f"value字段长度小于最小长度:{self.min},请修改value字段长度")
            raise ValueError(f"value字段长度小于最小长度:{self.min},请修改value字段长度")
        elif self.max is not None and len(value) > self.max:
            all_logger.error(f"value字段长度大于最大长度:{self.max},请修改value字段长度")
            raise ValueError(f"value字段长度大于最大长度:{self.max},请修改value字段长度")
        else:
            all_logger.info(f"value字段长度在允许范围内,StringField检验通过")
            return value
class AuthorField(StringField):
    def __init__(self ):
        super().__init__(min_length=5 , max_length= 50 , required=True)
        all_logger.info(f"调用AuthorField类，提供字符串长短验证功能。min_length={self.min},max_length={self.max},required={self.required}")
    def validate(self, value: any = None ) -> any:
        """用户作者验证逻辑"""
        super().validate(value)
        all_logger.info(f"value字段长度在允许范围内,AuthorField检验通过,在default模式下您应当知道该字段为作者名,为进行更多扩展,如需扩展请自行修改该字段")
        return value
class ContentField(StringField):
    def __init__(self):
        super().__init__(min_length=5 , max_length= 100000 )
        all_logger.info(f"调用ContentFeild类，提供文章长短验证功能。min_length={self.min},max_length={self.max},required={self.required}")
    def validate(self, value: any = None ) -> any:
        """用户文章验证逻辑"""
        super().validate(value)
        all_logger.info(f"value字段长度在允许范围内,ContentField检验通过")
        return value
class ListField(Field):
    def __init__(self, max_elements=100, **kwargs):
        self.max_elements = max_elements
        super().__init__(**kwargs)
        all_logger.info(f"调用ListField类，提供列表元素验证功能。max_elements={self.max_elements}")
    def validate(self, value:any = None) -> list:
        """列表验证逻辑"""
        super().validate(value)
        if not isinstance(value, list):
            all_logger.error(f"value字段不是列表类型,请修改value字段类型为列表")
            raise ValueError(f"value字段不是列表类型,请修改value字段类型为列表")
        else:
            if self.max_elements is not None and len(value) > self.max_elements:
                all_logger.error(f"value字段列表元素个数大于最大元素个数:{self.max_elements},请修改value字段列表元素个数")
                raise ValueError(f"value字段列表元素个数大于最大元素个数:{self.max_elements},请修改value字段列表元素个数")
            else:
                all_logger.info(f"value字段:{value}列表元素个数在允许范围内,ListField检验通过")
                return value
class IntegerField(Field):
    def __init__(self, min_value=None, max_value=None ,**kwargs):
        self.min_value = min_value
        self.max_value = max_value
        super().__init__(**kwargs)
        all_logger.info(f"调用IntegerField类，提供整数验证功能。min_value={self.min_value},max_value={self.max_value}")
    def validate(self, value: any = None) -> int:
        """整数验证逻辑"""
        super().validate(value)
        if not isinstance(value, int):
            all_logger.error(f"value字段不是整数类型,请修改value字段类型为整数")
            raise ValueError(f"value字段不是整数类型,请修改value字段类型为整数")
        else:
            if self.min_value is not None and value < self.min_value:
                all_logger.error(f"value字段小于最小值:{self.min_value},请修改value字段值")
                raise ValueError(f"value字段小于最小值:{self.min_value},请修改value字段值")
            elif self.max_value is not None and value > self.max_value:
                all_logger.error(f"value字段大于最大值:{self.max_value},请修改value字段值")
                raise ValueError(f"value字段大于最大值:{self.max_value},请修改value字段值")
            else:
                all_logger.info(f"value字段:{value}在允许范围内,IntegerField检验通过")
                return value




if __name__ == '__main__':
    print(StringField(min_length=5, max_length=20, required=True).validate("S_zhi"))
    print(AuthorField().validate("LiMing"))
    print(ContentField().validate("S_asdazhi++"))
    print(ListField(max_elements=8).validate([1, 2, 3, 4, 5, 6, 7, 8]))
    print(IntegerField(min_value=0, max_value=100).validate(5000))